Linux 系统架构详解
Linux 是 Linus Torvalds 于 1991 年发起的开源操作系统内核,遵循 GPLv2 协议。经过三十余年发展,已成为服务器、嵌入式、移动(Android 基于 Linux 内核)和超级计算领域的主流内核。本文从行为图与结构图两个维度梳理 Linux 系统的核心架构。
1. 概述
Linux 系统采用宏内核架构:整个内核运行在单一地址空间,内核直接管理 CPU、内存、设备、文件系统和网络。与微内核不同,Linux 通过内核模块(LKM)实现动态扩展能力。
核心职责
- 进程管理:创建/销毁进程、调度、同步
- 内存管理:虚拟内存、分页、内存映射
- 文件系统:VFS 抽象层、支持 ext4/XFS/Btrfs 等
- 网络栈:TCP/IP 协议栈、socket 接口
- 设备驱动:字符/块/网络设备抽象
关键特性
- 多任务抢占式调度(CFS / EEVDF)
- SMP 多核支持(对称多处理)
- 虚拟内存与写时复制(COW)
- 内核模块热加载(LKM)
- cgroup/namespace(容器基础)
- eBPF(内核可编程扩展)
syscall 指令陷入内核,完全绕开 libc。本文图中的 "glibc 封装" 仅为最常见路径的示意。
2. 行为图(系统"做什么")
行为图描述 Linux 系统在运行时的动态行为和交互流程。
2.1 用例图 — 用户视角
从三类典型用户角色看 Linux 系统提供的功能:系统管理员、开发者、普通用户。
2.2 活动图 — 系统启动流程
从按下电源键到登录提示符的完整启动链,涉及固件、引导程序、内核初始化与 init 进程。
2.3 活动图 — 系统调用流程
用户态程序通过系统调用陷入内核,内核验证参数、执行操作后返回结果。以 open() → read() → close() 为例。
2.4 序列图 — read() 系统调用全过程
以 read(fd, buf, count) 为例,展示从用户态到内核态、经 VFS → 文件系统 → 块层 → 磁盘驱动的完整调用链。
2.5 状态机图 — 进程生命周期
Linux 中进程在创建、运行、等待、终止之间切换,由调度器、信号和系统调用驱动。
2.6 序列图 — PTY/TTY 数据流(SSH 终端为例)
PTY(Pseudo Terminal)是 Linux 终端体系的核心抽象。在 SSH 会话、图形终端模拟器、tmux/screen 等场景中,数据通过PTY 主从对(master/slave pair)在用户进程与终端程序之间双向传输。以下以 SSH 远程登录后键入 ls 为例,展示字符的完整流向——尤其关注echo 回显和线路规程缓冲机制。
3. 结构图(系统"由什么组成")
结构图描述 Linux 系统的静态组成,从内核子系统、源码组织、核心数据结构到部署层次。
3.1 组件图 — 内核子系统架构
Linux 内核的五大核心子系统及其相互关系:进程调度器、内存管理、VFS 文件系统、网络栈、设备驱动。
3.2 包图 — 内核源码目录结构
Linux 内核源码树 (v7.x) 的顶层目录组织,展示各子系统的代码分布。
3.3 类图 — 核心内核数据结构
Linux 内核中以 C 结构体实现的核心数据抽象:进程描述符、文件对象、inode、网络 socket 等。
3.4 部署图 — Linux 系统分层架构
从硬件到用户的纵向分层关系,展示用户空间与内核空间的边界及各层之间的通信方式。
3.5 组件图 — TTY/PTY 终端子系统
TTY(Teletypewriter)子系统是 Linux 最古老的子系统之一,负责管理所有"终端"——无论是物理串口控制台、内核虚拟控制台(/dev/tty1),还是软件模拟的伪终端(PTY)。现代 Linux 的终端交互(SSH、docker exec -it、图形终端模拟器)几乎全部依赖 PTY。
/dev/ptmx— PTY Master 多路复用器,open 后创建一对 master/slave/dev/pts/N— PTY Slave 端,被 shell 等进程作为控制终端使用- 线路规程(Line Discipline/N_TTY) — 在 TTY 核心层处理特殊字符(^C 发 SIGINT、^Z 发 SIGTSTP、^D EOF、退格等)、echo 回显、行缓冲(canonical mode)
- termios — 控制终端行为的数据结构:波特率、echo/icanon 开关、控制字符映射等
/dev/tty— 始终指向当前进程的控制终端,不受 stdin/stdout 重定向影响/dev/console— 系统控制台,内核 printk() 的输出目标
4. 使用手册
4.1 编译内核
# 获取源码 git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git cd linux # 配置(基于当前运行内核的配置) make localmodconfig # 编译 make -j$(nproc) # 安装模块与内核 sudo make modules_install sudo make install # 更新 GRUB 并重启 sudo update-grub sudo reboot
4.2 内核模块管理
lsmod # 列出已加载模块 sudo modprobe <name> # 加载模块(自动处理依赖) sudo rmmod <name> # 卸载模块 modinfo <name> # 查看模块信息
4.3 进程与调度
ps aux # 查看所有进程 top # 实时进程监控 nice -n 10 <cmd> # 以低优先级启动 renice -5 <pid> # 调整运行中进程的优先级 taskset -c 0,1 <cmd># 绑定进程到指定 CPU
4.4 内存查看
free -h # 查看内存使用概况 cat /proc/meminfo # 详细内存统计 vmstat 1 # 每秒内存与 CPU 统计 slabtop # 内核 slab 缓存分析
4.5 文件系统操作
mount /dev/sda1 /mnt # 挂载分区 mkfs.ext4 /dev/sda1 # 格式化 ext4 df -h # 查看挂载点使用量 lsblk # 列出块设备 cat /proc/filesystems # 查看内核支持的文件系统
4.6 网络调试
ip addr show # 查看网络接口 ss -tlnp # 查看监听端口 tcpdump -i eth0 port 80 # 抓包 iptables -L -n -v # 查看防火墙规则 sysctl net.ipv4.ip_forward=1 # 开启 IP 转发
4.7 内核日志与调试
dmesg -w # 实时查看内核日志 journalctl -k # 查看内核启动日志 cat /proc/version # 内核版本信息 cat /proc/cmdline # 启动参数 strace <cmd> # 跟踪系统调用 perf top # 性能分析
4.8 容器的内核基础
# namespace 操作 unshare --mount --uts --ipc --net --pid --fork /bin/bash # cgroup v2 操作 ls /sys/fs/cgroup/ cat /sys/fs/cgroup/cgroup.controllers
4.9 TTY/PTY 终端相关
tty # 查看当前控制终端设备名 stty -a # 查看/设置终端属性(echo/icanon/行数等) stty raw # 切换为原始模式(禁用行缓冲和 echo) stty sane # 恢复终端为正常设置 resize # 告知终端当前窗口大小 script session.log # 录制终端会话到文件 screen -S <name> # 创建命名的 screen 会话 screen -ls # 列出所有 screen 会话 screen -r <name> # 重新连接 screen 会话 tmux new -s <name> # 创建命名的 tmux 会话 tmux ls # 列出所有 tmux 会话 tmux attach -t <name> # 重新连接 tmux 会话 # 查看进程的控制终端 ps -eo pid,tty,cmd | grep pts # 向指定终端发送消息 write <user> /dev/pts/N echo "hello" > /dev/pts/N # 查看谁登录了哪些终端 who w